package Save.JavaUtil.Redis;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

/**
 * 
 * @author jackleijie
 * pom配置如下
 * <dependency>
		<groupId>redis.clients</groupId>
		<artifactId>jedis</artifactId>
		<version>2.9.0</version>
   </dependency>
 */
public class JedisPoolUtils {
	private static ShardedJedisPool pool;
	private static void createPool() {
	//配置redis地址
	String host = "redis.host";
	//配置redis端口
	String port = "redis.port";
	//配置redis密码
    String pass = "redis.pass";
    //最大空闲数： 500
	String maxIdle = "redis.maxIdle";
	//最大等待时间： 1000
	String maxWait = "redis.maxWait";
	//借用：false
	String testOnBorrow = "redis.testOnBorrow";
	
	// 建立连接池配置参数
	JedisPoolConfig config = new JedisPoolConfig();
	// 控制一个pool可分配多少个jedis实例，通过pool.getResource()来获取；
	
	// 如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。

	config.setMaxTotal(-1);
	// 设置最大阻塞时间，记住是毫秒数milliseconds

	// 表示当borrow(引入)一个jedis实例时，最大的等待时间，如果超过等待时间，则直接抛出JedisConnectionException；

	config.setMaxWaitMillis(Integer.parseInt(maxWait));
	// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。

	config.setMaxIdle(Integer.parseInt(maxIdle));
	// 在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；

	if("true".equals(testOnBorrow)){
		config.setTestOnBorrow(true);
	}else{
		config.setTestOnBorrow(false);
	}
    List<JedisShardInfo> shardedJedis = new ArrayList<JedisShardInfo>();
    JedisShardInfo si = new JedisShardInfo(host, port);
    si.setPassword(pass);
    shardedJedis.add(si);
    setPool(new ShardedJedisPool(config, shardedJedis));
	}
	/**
	 * 在多线程环境同步初始化
	 */
	private static synchronized void poolInit() {
		if (null == getPool())  
			createPool();
	}
	/**
	 * 获取一个jedis 对象
	 * @return
	 */
	public static ShardedJedis getShardedJedis() {
	
		if (null == getPool())
			poolInit();
		return getPool().getResource();
	}
	
	/**
	 * 归还一个连接
	 * @param jedis
	 */
	@SuppressWarnings("deprecation")
	public static void returnRes(ShardedJedis shardedJedis) {
		if (shardedJedis != null) {
			getPool().returnResource(shardedJedis);
		}
	}
	
	public static ShardedJedisPool getPool() {
		return pool;
	}
	
	public static void setPool(ShardedJedisPool pool) {
		JedisPoolUtils.pool = pool;
	}
	
	/**
	 * 将以键值对形式存入redis
	 * @param time 设置存储时间
	 * @param key 设置存储key
	 * @param value 设置存储value
	 * @return 返回key
	 */
	public static String setObject(int time,String key,Object value) {
		ShardedJedis jedis = getShardedJedis();
		jedis.setex(key, time, value.toString());
		jedis.close();
		return key;
	}
	
	/**
	 * 根据key获取value
	 * @param key 所存储的key
	 * @return 当前key对应的value
	 */
	public static String getValue(String key) {
		ShardedJedis jedis = getShardedJedis();
		String value = jedis.get(key);
		if(StringUtils.isBlank(value)) {
			jedis.close();
			return null;
		}
		jedis.close();
		return value;
	}
	
	
}
